0x01 现成工具
任务管理器
procdump:procdump -ma lsass.exe lsass.dmp
Sharp dump:其核心也是使用MiniDumpWriteDump
Out-MiniDump:是PowerSploit下的一个转储组件。同理也是使用MiniDumpWriteDump
0x02 本机API或者Dll
comsvcs.dll:管理员权限下使用rundll32.exe comsvcs.dll MiniDump <lsass PID> <out path> full
API就是转储最常见的MiniDumpWriteDump
。
除了常规的直接使用MiniDumpWriteDump
,现在很多C2都使用带有回调功能的MiniDumpWriteDump
,因为MiniDumpWriteDump
函数原型,函数第7个参数是一个指向MINIDUMP_CALLBACK_INFORMATION
结构的指针,包含了回调函数的指针和参数。使用带回调功能的MiniDumpWriteDump
并没有改写MiniDumpWriteDump
函数,实现起来比较方便,也能过掉国内大多数AV。具体使用如下。
|
|
0x03 RtlReportSilentProcessExit静默进程退出
LSASS Memory Dumps are Stealthier than Ever Before - Part 2
当进程被终止的时候,它会调用ntdll.dll的RtlReportSilentProcessExit()
,然后与Windows 错误报告服务(WerSvcGroup
下的WerSvc
)通讯,然后WER服务将启动WerFault.exe
,它将执行退出进程的转储。有趣的是,调用此API不会导致进程退出
。
Silent Process Exit是从windows7中引入的一种机制,该机制在1)自身调用ExitProcess()自行终止,或者2)另一个进程通过TerminateProcess()终止时,为受监控进程触发指定的操作,目前支持的操作有三种:1)启动监控进程 2)显示弹出窗口 3)创建转储文件
利用Silent Process Exit机制需要设置注册表项目。1)在HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<process.exe>
的GlobalFlag
键设置为FLG_MONITOR_SILENT_PROCESS_EXIT (0x200)
2)在HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\<process.exe>
项下设置三个属性
关于HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\<process.exe>
项目下三个属性更为详细的介绍如下
在静默退出 DUMP LSASS.EXE一文中有详细的代码介绍。在装了卡巴斯基的环境中,因为卡巴对于LSASS Dump的保护机制,第三方进程很难对LSASS进程进行转储,可以考虑利用注入的方式进行转储,或者使用文章中的RemoteCreateThread方法进行转储。但是此时可能又要准备绕过卡巴对于注入的监控。
0x04 LSASS SSP自加载
SSP,全称Security Support Provider,又名Security Package。针对绕过卡巴斯基的LSASS Dump可以使用SSP
+MiniDumpWriteDump
的方式。
Intercepting Logon Credentials via Custom Security Support Provider and Authentication Packages一文中提供了如何编写一个可以使用的SSP dll文件。3gstudent在他的Mimikatz中SSP的使用介绍了SSP的基本原理和如何添加SSP的三种方法。
SSP是一个dll,不同的功能对应不同的导出函数。具体可以参见下面的代码。该代码主要包含5个函数
- SpInitialize 用于初始化SSP并提供函数指针列表,此处可以直接返回
- SpShutDown 用于卸载SSP,暂时无法卸载。
- SpGetInfo 提供有关SSP的信息,包括版本,名称和说明
- SpAcceptCredentials 可以执行的操作。
- SpLsaModeInitialize 导出函数。
|
|
添加SSP主要有三种方法。
方法一:等待重启
123(1) 将ssp.dll复制到c:\windows\system32(2) 修改HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\的Security Packages的值设置为ssp.dll(3) 等待系统重新启动方法二:调用AddSecurityPackage
12345678910111213141516171819(1)(2)同方法一(3)调用AddSecurityPackage//测试代码如下//////////int main(int argc, char **argv){SECURITY_PACKAGE_OPTIONS option;option.Size = sizeof(option);option.Flags = 0;option.Type = SECPKG_OPTIONS_TYPE_LSA;option.SignatureSize = 0;option.Signature = NULL;SECURITY_STATUS SEC_ENTRYnRet = AddSecurityPackageA("mimilib", &option);return 0;}方法三:使用RPC控制lsass加载SSP:这个方法的优势在于无需有过多敏感的痕迹(写注册表,调用AddSecurityPackage,不需要对lsass进程的内存进行写操作,lasss进程中不存在加载的dll),这个方法是XPN大佬发现的,其开源在他的github中,并在他的博文exploring-mimikatz-part-2/一文中有详细的介绍,其大概意思就是通过逆向分析AddSecurityPackage API函数,发现内部是通过RPC调用实现加载SSP.dll的。
经过测试使用SSP+MiniDumpWriteDump回调的方式会造成系统卡死,原因,和@seventeen师傅了解了,可能是巨硬家使用SSP并不支持回调。所以我直接使用SSP+MiniDumpWriteDump,并没有采用回调方式可以成功转储。
参考文献
[+] 1. Some ways to dump LSASS.exe
[+] 2. 几种免杀转储lsass进程的技巧
[+] 3. 静默退出 DUMP LSASS.EXE
[+] 4. Intercepting Logon Credentials via Custom Security Support Provider and Authentication Packages
[+] 5. Mimikatz中SSP的使用